package com.fdb.efp.nls.service.impl.bd;

import com.fdb.basic.framework.core.constant.MonAlrmLvlEnums.MonAlrmLvlEnum;
import com.fdb.basic.framework.core.util.DateTool;
import com.fdb.efp.nls.service.facade.bd.BdIntFeeDetailBatchService;
import com.fdb.efp.nls.service.util.DueDataUtil;
import com.fdb.efp.nls.service.facade.AccLoanService;
import com.fdb.efp.nls.service.facade.AccoutErroTempService;
import com.fdb.efp.nls.service.facade.BdIntFeeDetailService;
import com.fdb.efp.nls.service.facade.BdIntFeeDetailTempService;
import com.fdb.efp.nls.service.vo.AccLoanVO;
import com.fdb.efp.nls.service.vo.AccoutErroTempVO;
import com.fdb.efp.nls.service.vo.BdIntFeeDetailTempVO;
import com.fdb.efp.nls.service.vo.BdIntFeeDetailVO;
import com.fdb.efp.nls.service.facade.BdLoanpayService;
import com.fdb.efp.nls.service.facade.NlsApplyInfoService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;

/**
 * 
 * 根据百度同步过来的手工手工减免息费明细文件信息临时表数据修改手工减免息费明细表
 * 
 * @author ludayong
 * @since 2019年3月7日 下午3:18:50
 * @version 1.0
 */
@Service("bdIntFeeDetailBatchService")
public class BdIntFeeDetailBatchServiceImpl implements BdIntFeeDetailBatchService {

	private static Logger logger = LoggerFactory.getLogger(BdIntFeeDetailBatchServiceImpl.class);

	@Autowired
	@Qualifier("bdIntFeeDetailTempService")
	private BdIntFeeDetailTempService bdIntFeeDetailTempService;// 手工减免息费明细临时信息

	@Autowired
	@Qualifier("bdIntFeeDetailService")
	private BdIntFeeDetailService bdIntFeeDetailService;// 手工减免息费明细信息

	@Autowired
	@Qualifier("accLoanService")
	private AccLoanService accLoanService;// 借据信息

	@Autowired
	@Qualifier("accoutErroTempService")
	private AccoutErroTempService accoutErroTempService;// 错误信息

	// @Autowired
	// @Qualifier("bdDnDetailTempService")
	// private BdDnDetailTempService bdDnDetailTempService;// 放款明细临时信息
	@Autowired
	@Qualifier("bdLoanpayService")
	private BdLoanpayService bdLoanpayService;// 百度放款通知记录信息

	@Autowired
	@Qualifier("nlsApplyInfoService")
	private NlsApplyInfoService nlsApplyInfoService;// 网贷申请信息

	/**
	 * 
	 * 根据百度同步过来的手工手工减免息费明细文件信息临时表数据修改手工减免息费明细表 <br>
	 * 0.1:ludayong:2019年3月7日 下午3:17:41:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年3月7日 下午3:17:41
	 * @date 2019年3月7日 下午3:17:41
	 * @version 0.1
	 */
	@Override
	public boolean batchUpdateIntFeeDetail() throws Exception {
		boolean result = false;
		long startTime = System.currentTimeMillis();
		logger.info("同步百度手工减免息费明细临时数据到手工减免息费明细表：[" + DateTool.formatDate(new Date(startTime), DateTool.PATTERN_DATETIME) + "]， 处理开始");
		// 可以配置参数
		Integer pageSize = 1000;
		try {
			// 单位转换
			final int oneHundred = 100;
			// 新增或者修改的手工减免息信息
			List<BdIntFeeDetailTempVO> list = null;
			// 分页信息
			BdIntFeeDetailTempVO pageInfo = new BdIntFeeDetailTempVO();
			// 新增或者修改的手工减免息数量
			int num = 0;
			// 页数
			int page = 1;
			// pageSize初始化
			if (pageSize > 0) {
				pageInfo.setSize(pageSize);
			} else {
				pageInfo.setSize(1000);
			}
			// 判断循环次数
			int size = bdIntFeeDetailTempService.queryCount();
			String size_msg = "【手工减免息费明细临时表】数据量：" + size;
			logger.info(size_msg, "message{}");
			int loopCount = (size / pageInfo.getSize()) + 1;
			// 放款信息
			// BdDnDetailTempVO inBdDnDetailTempVO = new BdDnDetailTempVO();
			// 百度放款通知记录信息
			// BdLoanpayVO inBdLoanpayVO = new BdLoanpayVO();
			// 网贷申请基本信息
			// NlsApplyInfoVO inNlsApplyInfoVO = new NlsApplyInfoVO();
			// 借据信息
			AccLoanVO inAccLoanVO = new AccLoanVO();
			// 借据号
			String bdLoanId = null;
			for (int i = 0; i < loopCount; i++) {
				String page_msg = "【手工减免息费明细临时表】当前页数：" + pageInfo.getPage() + "，分页大小：" + pageInfo.getSize();
				logger.info(page_msg, "message{}");
				// 分页查询【手工减免息费明细表】数据
				List<BdIntFeeDetailTempVO> tempList = bdIntFeeDetailTempService.queryByPage(pageInfo);
				list = new ArrayList<BdIntFeeDetailTempVO>();
				if (Objects.nonNull(tempList) && !tempList.isEmpty()) {
					for (BdIntFeeDetailTempVO bdIntFeeDetailTempVO : tempList) {
						bdLoanId = bdIntFeeDetailTempVO.getLoanId();
						// 放款明细入参
						// inBdDnDetailTempVO.setLoanId(bdLoanId);
						// 查询的放款信息
						// BdDnDetailTempVO queryBdDnDetailTempVO =
						// bdDnDetailTempService.queryByPk(inBdDnDetailTempVO);
						// 百度放款通知记录信息
						// inBdLoanpayVO.setLoanId(bdLoanId);
						// 查询百度放款通知记录信息
						// BdLoanpayVO queryBdLoanpayVO = bdLoanpayService.queryByPk(inBdLoanpayVO);
						// String orderId = "";
						// if (Objects.nonNull(queryBdLoanpayVO)) {
						// // 订单号
						// orderId = queryBdLoanpayVO.getOrderId();
						// } else {
						// String tableName = "bd_loanpay";
						// String errorMsg = "未查询到手工减免息信息关联的百度放款通知记录信息，放款订单号：" + orderId + "，借据号：" +
						// bdLoanId;
						// addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg,
						// errorMsg);
						// logger.error(errorMsg);
						// }
						// 网贷用信申请流水号
						// String applySeq = "";
						// 订单号非空
						// if (!StringUtil.isNullorBank(orderId)) {
						// // 订单号
						// inNlsApplyInfoVO.setBdOrderId(orderId);
						// // 查询的网贷申请基本信息
						// NlsApplyInfoVO queryNlsApplyInfoVO =
						// nlsApplyInfoService.queryByPk(inNlsApplyInfoVO);
						// if (Objects.nonNull(queryNlsApplyInfoVO)) {
						// // 网贷用信申请流水号
						// applySeq = queryNlsApplyInfoVO.getApplySeq();
						// } else {
						// String tableName = "nls_apply_info";
						// String errorMsg = "未查询到手工减免息信息关联的网贷申请基本信息，放款订单号：" + orderId + "，借据号：" +
						// bdLoanId;
						// addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg,
						// errorMsg);
						// logger.error(errorMsg);
						// }
						// }
						// 网贷用信申请流水号非空
						// if (!StringUtil.isNullorBank(applySeq)) {
						// 设置借据号
						inAccLoanVO.setBillNo(bdIntFeeDetailTempVO.getLoanId());
						AccLoanVO queryAccLoanVo = accLoanService.queryByPk(inAccLoanVO);
						// 1.1根据手工减免息临时信息的借据号查询借据信息是否存在，存在：进行下一步操作，不存在：记录异常信息
						if (Objects.nonNull(queryAccLoanVo)) {
							// 设置新的借据号
							// bdIntFeeDetailTempVO.setLoanId(loanId);
							// 2.1根据减免息临时信息的借据号查询减免息正式表信息是否存在，存在进行修改，不存在新增
							// total_reduced_amt_manual 减免总金额 分
							bdIntFeeDetailTempVO.setTotalReducedAmtManual(
									DueDataUtil.checkDecimalInfo(bdIntFeeDetailTempVO.getTotalReducedAmtManual(), oneHundred));
							// prin_reduced_amt_manual 减免本金金额 分
							bdIntFeeDetailTempVO.setPrinReducedAmtManual(
									DueDataUtil.checkDecimalInfo(bdIntFeeDetailTempVO.getPrinReducedAmtManual(), oneHundred));
							// int_reduced_amt_manual 减免利息金额 分
							bdIntFeeDetailTempVO.setIntReducedAmtManual(
									DueDataUtil.checkDecimalInfo(bdIntFeeDetailTempVO.getIntReducedAmtManual(), oneHundred));
							// pnlt_reduced_amt_manual 减免罚息金额 分
							bdIntFeeDetailTempVO.setPnltReducedAmtManual(
									DueDataUtil.checkDecimalInfo(bdIntFeeDetailTempVO.getPnltReducedAmtManual(), oneHundred));
							// fund_fee_reduced_amt_manual 减免借款服务费金额 分
							bdIntFeeDetailTempVO.setFundFeeReducedAmtManual(
									DueDataUtil.checkDecimalInfo(bdIntFeeDetailTempVO.getFundFeeReducedAmtManual(), oneHundred));
							// charges_reduced_amt_manual 减免分期手续费 分
							bdIntFeeDetailTempVO.setChargesReducedAmtManual(
									DueDataUtil.checkDecimalInfo(bdIntFeeDetailTempVO.getChargesReducedAmtManual(), oneHundred));
							// overdue_reduced_amt_manual 减免逾期费 分
							bdIntFeeDetailTempVO.setOverdueReducedAmtManual(
									DueDataUtil.checkDecimalInfo(bdIntFeeDetailTempVO.getOverdueReducedAmtManual(), oneHundred));
							// repay_violate_reduced_amt_manual 减免提前还款违约金 分
							bdIntFeeDetailTempVO.setRepayViolateReducedAmtManual(
									DueDataUtil.checkDecimalInfo(bdIntFeeDetailTempVO.getRepayViolateReducedAmtManual(), oneHundred));
							// refund_violate_reduced_amt_manual 减免退款违约金 分
							bdIntFeeDetailTempVO.setRefundViolateReducedAmtManual(
									DueDataUtil.checkDecimalInfo(bdIntFeeDetailTempVO.getRefundViolateReducedAmtManual(), oneHundred));
							// service_reduced_amt_manual 减免担保费 分
							bdIntFeeDetailTempVO.setServiceReducedAmtManual(
									DueDataUtil.checkDecimalInfo(bdIntFeeDetailTempVO.getServiceReducedAmtManual(), oneHundred));
							// cur_date 账务日期 cur_date 账务日期:对账日期（T日）
							bdIntFeeDetailTempVO.setCurDate(DueDataUtil.dateInfoTrans(bdIntFeeDetailTempVO.getCurDate()));
							// tran_date 交易日期
							bdIntFeeDetailTempVO.setTranDate(DueDataUtil.dateInfoTrans(bdIntFeeDetailTempVO.getTranDate()));
							// 新增或者修改的手工减免息信息
							list.add(bdIntFeeDetailTempVO);
						} else {
							String tableName = "acc_loan";
							String errorMsg = "未查询到手工减免息信息关联的借据信息，借据号：" + bdLoanId;
							addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg, errorMsg);
							logger.error(errorMsg);
						}
						// }
					}
					// 新增或者修改的手工减免息信息
					if (Objects.nonNull(list) && !list.isEmpty()) {
						int updateSize = bdIntFeeDetailService.insertOrUpdateBdIntFeeDetail(list);
						num += updateSize;
					}
				}
				pageInfo.setPage(++page);
			}
			String num_msg = "【手工减免息费明细表】插入或更新数据处理结果:" + num;
			logger.info(num_msg, "message{}");
			result = true;
		} catch (Exception e) {
			e.printStackTrace();
			String tableName = "bd_int_fee_detail";
			String errorMsg = "同步百度手工减免息费明细临时数据到手工减免息费明细表出错";
			String remark = "同步百度手工减免息费明细临时数据到手工减免息费明细表出错，错误信息：" + e.getMessage();
			addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg, remark);
			logger.error(remark);
			throw new Exception(remark);
		}
		long endTime = System.currentTimeMillis();
		logger.info("同步百度手工减免息费明细临时数据到手工减免息费明细表：[" + DateTool.formatDate(new Date(endTime), DateTool.PATTERN_DATETIME) + "]， 处理结束");
		logger.info("同步百度手工减免息费明细临时数据到手工减免息费明细表，耗时：[" + (endTime - startTime) / 1000.0 + "]秒，处理结果[" + result + "]");
		return result;
	}

	/**
	 * 
	 * 根据减免息临时信息的借据号查询减免息正式表信息是否存在 <br>
	 * 0.1:ludayong:2019年3月8日 上午9:03:27:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年3月8日 上午9:03:27
	 * @date 2019年3月8日 上午9:03:27
	 * @version 0.1
	 */
	public boolean queryBdIntFeeDetailInfo(BdIntFeeDetailTempVO bdIntFeeDetailTempVO) {
		boolean isExit = false;
		BdIntFeeDetailVO inBdIntFeeDetailVo = new BdIntFeeDetailVO();
		if (Objects.nonNull(bdIntFeeDetailTempVO)) {
			inBdIntFeeDetailVo.setSeqNo(bdIntFeeDetailTempVO.getSeqNo());
			// 查询减免息正式表信息是否存在
			BdIntFeeDetailVO queryBdIntFeeDetailVO = bdIntFeeDetailService.queryByPk(inBdIntFeeDetailVo);
			if (Objects.nonNull(queryBdIntFeeDetailVO)) {
				isExit = true;
			}
		}
		return isExit;
	}

	/**
	 * 
	 * 记录异常信息 <br>
	 * 0.1:ludayong:2019年3月8日 上午8:40:46:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年3月8日 上午8:40:46
	 * @date 2019年3月8日 上午8:40:46
	 * @version 0.1
	 */
	private void addErrorInfo(String tableName, String errorType, String errorMsg, String remark) {
		AccoutErroTempVO accoutErroTempVO = new AccoutErroTempVO();
		// 表名
		accoutErroTempVO.setTableName(tableName);
		// 错误级别
		accoutErroTempVO.setErroType(errorType);
		// 错误信息
		accoutErroTempVO.setErroMsg(errorMsg);
		// 备注
		accoutErroTempVO.setRemark(remark);
		// 创建时间
		accoutErroTempVO.setCreateData(DateTool.getCurrentDateTime());
		// 修改时间
		accoutErroTempVO.setLastModifyTime(DateTool.getCurrentDateTime());
		// 记录异常信息
		accoutErroTempService.insert(accoutErroTempVO);
	}
}
